package p2;

/**
 * 参数函数，可以通过创造子类来改变功能，并通过不同的运算符进行组合条件
 * 高级函数 / 行为参数化
 * 
 *  ！！λ表达式 ！！
 * 
 * @Eric
 * @2020-10-19
 */

//作用，确保此接口中只有一个抽象函数
@FunctionalInterface
public interface Condition
{
    public Boolean test(int n);
    
    //与 有假则假 ， *
    default Condition and(Condition other)
    {
        // 匿名类
        return new Condition()
                {
                    @Override public Boolean test(int n)
                    {
                        return Condition.this.test(n) && other.test(n);
                    }
                };
    }
    
    //或 有真则真 ， +
    default Condition or(Condition other)
    {
        //！！λ表达式 ！！ 效用等同于匿名类  **语法糖**
        return n->this.test(n) || other.test(n);
    }
    
    //非 取反
    default Condition not()
    {
        return n->!this.test(n);
    }
    
}
